package br.edu.senai.view;

import br.edu.senai.controller.ClienteDAO;
import br.edu.senai.controller.ParametroDAO;
import br.edu.senai.model.Cliente;
import br.edu.senai.model.Parametro;
import br.edu.senai.model.ParametroE;
import br.edu.senai.util.Mensagens;
import java.io.Serializable;
import java.util.ArrayList;
import java.util.List;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.ViewScoped;

/**
 * @author william.chenta
 */
@ManagedBean
@ViewScoped
public class RelacionarParametrosBean implements Serializable{

    private final ClienteDAO cdao;
    private final ParametroDAO pdao;
    private Cliente cliente;
    private List<ParametroE> parametrosE;

    public RelacionarParametrosBean() {
        cdao = new ClienteDAO();
        pdao = new ParametroDAO();
        cliente = new Cliente();
    }

    public void definirParametrosE() {
        parametrosE = new ArrayList<>();
        for (Parametro p : pdao.listar()) {
            ParametroE pe = new ParametroE();
            pe.setId(p.getId());
            pe.setNome(p.getNome());
            pe.setUnidadeMedida(p.getUnidadeMedida());
            pe.setCalculavel(p.getCalculavel());
            pe.setFormula(p.getFormula());
            pe.setChecked(cliente.getId() != null ? cliente.getParametros().contains(p) : false);
            parametrosE.add(pe);
        }
    }

    public void setParametrosE(List<ParametroE> parametrosE) {
        this.parametrosE = parametrosE;
    }

    public List<ParametroE> getParametrosE() {
        return parametrosE;
    }

    public List<Cliente> getClientes() {
        return cdao.listar();
    }

    public void salvar() {
        if (cliente.getId() != null) {
            for (ParametroE pe : parametrosE) {
                Parametro parametro = new Parametro();
                parametro.setId(pe.getId());
                parametro.setNome(pe.getNome());
                parametro.setUnidadeMedida(pe.getUnidadeMedida());
                parametro.setCalculavel(pe.getCalculavel());
                parametro.setFormula(pe.getFormula());
                if (pe.getChecked() && !cliente.getParametros().contains(parametro)) {
                    cliente.getParametros().add(parametro);
                } else if (!pe.getChecked() && cliente.getParametros().contains(parametro)) {
                    cliente.getParametros().remove(parametro);
                }
            }
            cdao.salvar(cliente);
            Mensagens.addMensagem("Cliente salvo com sucesso!");
        }
    }

    public Cliente getCliente() {
        return cliente;
    }

    public void setCliente(Cliente cliente) {
        this.cliente = cliente;
    }

    public void limpar() {
        cliente = new Cliente();
    }

    public void atualizarParametroE(ParametroE parametroE) {
        int index = parametrosE.indexOf(parametroE);
        parametrosE.set(index, parametroE);
    }
}
